/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.app.dao;

import edu.app.gui.Acceuil_1;
import edu.app.gui.Administrateurform;
import edu.app.persistence.Film;
import edu.app.persistence.Utilisateur;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTable;
import net.proteanit.sql.DbUtils;
import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;

/**
 *
 * @author esprit
 */
// Implémentation  spécifque de IDAO<T> correspondant à la classe persistante Film
// hérite de la connection
// ici, on fournit les implémentations des méthodes CRUD
public class FilmDAO extends IDAO<Film> {


    //la méthode doit retourner un objet de type Film à partir d'un int "id" (passé en paramètre)
    //l'object en question sera construit à partir des données recupérées à partir de la table T_EMPLOYEE et plus précisement à partir de la ligne dont le champs ID(INTEGER) correspond à id(int)
    //retourne null si la table T_EMPLOYEE ne contient pas une telle ligne
    @Override
    public Film find(String nom) {
        String sql = "SELECT * FROM FILM WHERE NOM=?"; //sql à compléter
        Film found = null; // Film à trouver (à partir de la base)
        PreparedStatement preparedStatement = null;//chargé d'exécuter le sql, une fois complété
        ResultSet resultSet = null;// chargé de récupérer les données retournées par la base

        try {
            preparedStatement = connection.prepareStatement(sql);//la connection prépare le preparedStatement
            preparedStatement.setString(1, nom);// on remplace le premier ? par id
            resultSet = preparedStatement.executeQuery(); //le preparedStatement exécute le sql paramètré (executeQuery() suppose un retour)
                                                          //retour = données de la base type ID, FIRSTNAME, LASTNAME
                                                          //le retour est récupéré dans le resultSet
            System.out.println(sql);
            if (resultSet.next()) {//on pointe sur la première ligne du resultSet s'il y en a
                //on instancie l'objet found de type Film à partir des données récupérées du resultSet
                //la récuprération se fait par type (getInt/getString) et par label de colonne ID/LASTNAME/FIRSTNAME
                found = new Film(resultSet.getString("nom"), resultSet.getString("GENRE"), resultSet.getString("DATEDESORTIE"),resultSet.getInt("VOTE"),resultSet.getString("SYNOPSIS"));
            }


        } catch (SQLException ex) {
            Logger.getLogger(FilmDAO.class.getName()).log(Level.SEVERE, "find Film failed", ex);
        } finally {

            //on libère les ressources : resultSet et preparedStatement
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (preparedStatement != null) {
                    preparedStatement.close();
                }
            } catch (SQLException ex) {
                Logger.getLogger(FilmDAO.class.getName()).log(Level.SEVERE, "free resourses failed", ex);
            }
        }
        return found;
    }

    //la méthode doit insérer une ligne dans la table T_EMPLOYEE
    //à partir des attributs de l'objet employee passés en paramètre, si une telle ligne n'existe pas
    @Override
    public void create(Film e) {

        if (find(e.getNom()) == null) { // on teste si la ligne avec l'ID de l'objet employee passé en paramètre existe
                                              // pour cela on utilise la methode find(int) implémentée ci-dessus
System.out.println("1");                                              //si cette ligne n'existe pas, on procède à son insertion

            String sql = "INSERT INTO Film (NOM, GENRE, DATEDESORTIE, SYNOPSIS) VALUES (?,?,?,?)";//du sql à compléter
            PreparedStatement preparedStatement = null;//chargé d'exécuter le sql, une fois complété
            try {
              
                preparedStatement = connection.prepareStatement(sql);
              //la connection prépare le preparedStatement
                preparedStatement.setString(1, e.getNom());
              // on remplace le premier ? par employee.getId()
                preparedStatement.setString(2, e.getGenre());
              // on remplace le deuxième ? par employee.getFirstname()
                preparedStatement.setString(3, e.getDatedesortie());
              // on remplace le troisème ? par employee.getLastname()
                preparedStatement.setString(4, e.getSynopsis());
              
                preparedStatement.executeUpdate();
              //le preparedStatement exécute le sql paramètré (executeUpdate() ne suppose pas de retour)
                                             //retour = données de la base type ID, FIRSTNAME, LASTNAME
               
            } catch (SQLException ex) {
                Logger.getLogger(FilmDAO.class.getName()).log(Level.SEVERE, "insert failed", ex);
            } finally {
                //libération des ressources :preparedStatement
                try {
                    if (preparedStatement != null) {
                        preparedStatement.close();
                    }
                } catch (SQLException ex) {
                    Logger.getLogger(FilmDAO.class.getName()).log(Level.SEVERE, "free resourses failed", ex);
                }
            }
        }


    }



    //la methode doit mettre à jour la ligne de la table T_EMPLOYEE correspondant à l'objet
    //employee passé en paramètre, si cette ligne existe bien sûr.
    @Override
    public void update(Film e) {
        if (find(e.getNom()) != null) { // on teste si la ligne avec l'ID de l'objet employee passé en paramètre existe
                                              // pour cela on utilise la methode find(int) implémentée ci-dessus
                                              //si cette ligne existe, on procède à sa mise à jour

            String sql = "UPDATE Film SET GENRE=?, DATEDESORTIE=?, SYNOPSIS=? WHERE NOM=?";//sql à compléter
            PreparedStatement preparedStatement = null;//chargé d'exécuter le sql, une fois complété
            try {
                preparedStatement = connection.prepareStatement(sql);//la connection prépare le preparedStatement
                preparedStatement.setString(1, e.getGenre());// on remplace le premier ? par employee.getFirstname()
                preparedStatement.setString(2, e.getDatedesortie());// on remplace le deuxième ? par employee.getLastname()
                preparedStatement.setString(3, e.getSynopsis());// on remplace le troisème ? par employee.getId()
                preparedStatement.executeUpdate();//le preparedStatement exécute le sql paramètré (executeUpdate() ne suppose pas de retour)
                                                  //retour = données de la base type ID, FIRSTNAME, LASTNAME
                System.out.println(sql);
            } catch (SQLException ex) {
                Logger.getLogger(FilmDAO.class.getName()).log(Level.SEVERE, "update failed", ex);
            } finally {
                //libération des ressources :preparedStatement
                try {
                    if (preparedStatement != null) {
                        preparedStatement.close();
                    }
                } catch (SQLException ex) {
                    Logger.getLogger(FilmDAO.class.getName()).log(Level.SEVERE, "free resourses failed", ex);
                }
            }
        }

    }

    //la methode doit supprimer la ligne de la table T_EMPLOYEE correspondant à l'objet
    //employee passé en paramètre, si une telle ligne existe bien
    @Override
    public void delete(Film e) {
        if (find(e.getNom()) != null) { // on teste si la ligne avec l'ID de l'objet employee passé en paramètre existe
                                              // pour cela on utilise la methode find(int) implémentée ci-dessus
                                              //si cette ligne existe, on procède à sa suppression

            String sql = "DELETE FROM Film WHERE nom=?";//sql à compléter
            PreparedStatement preparedStatement = null;//chargé d'exécuter le sql, une fois complété
            try {
                preparedStatement = connection.prepareStatement(sql);//la connection prépare le preparedStatement
                preparedStatement.setString(1, e.getNom());// on remplace le premier ? par employee.getId()
                preparedStatement.executeUpdate();//le preparedStatement exécute le sql paramètré (executeUpdate() ne suppose pas de retour)
                                                  //retour = données de la base type ID, FIRSTNAME, LASTNAME
                System.out.println(sql);
            } catch (SQLException ex) {
                Logger.getLogger(FilmDAO.class.getName()).log(Level.SEVERE, "delete failed", ex);
            } finally {
                try {
                    if (preparedStatement != null) {
                        preparedStatement.close();
                    }
                } catch (SQLException ex) {
                    Logger.getLogger(FilmDAO.class.getName()).log(Level.SEVERE, "free resourses failed", ex);
                }
            }

        }

    }
    // cette méthode retourne une liste "List<Film>" construite à partir de tous les enregistrements de la table T_EMPLOYEE
    @Override
    public List<Film> findAll() {
        List<Film> list = new ArrayList<Film>();//on instancie une liste  d'employés (vide)
                                                        // Interface List<Film>
                                                        // Implémentation ArrayList<Film>
        String sql = "SELECT * FROM Film";//script sql "complet"
                                                // rq: aucun n'est paramétrage requis
        Statement statement = null; //chargé d'exécuter le script sql
        ResultSet resultSet = null; // chargé de récupérer les données retournées par la base

        try {
            statement = connection.createStatement(); //la connection crée le statement
            resultSet = statement.executeQuery(sql);  //le preparedStatement exécute le sql  (executeQuery() suppose un retour)
                                                      //retour = données de la base type ID, FIRSTNAME, LASTNAME
                                                      //le retour est récupéré dans le resultSet
            System.out.println(sql);
            while (resultSet.next()) {//parcours du resultSet ligne par ligne
                //à chaque itération, on instancie un objet de type Film à partir des données récupérées du resultSet et on le rajoute à la liste
                //la récuprération se fait par type (getInt/getString) et par label de colonne ID/LASTNAME/FIRSTNAME
                list.add(new Film(resultSet.getString("NOM"), resultSet.getString("GENRE"), resultSet.getString("DATEDESORTIE"),resultSet.getInt("VOTE"),resultSet.getString("SYNOPSIS")));
            }


        } catch (SQLException ex) {
            Logger.getLogger(FilmDAO.class.getName()).log(Level.SEVERE, "find all employees failed", ex);
        } finally {
            //on libère les ressources : resultSet et preparedStatement
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException ex) {
                Logger.getLogger(FilmDAO.class.getName()).log(Level.SEVERE, "free resourses failed", ex);
            }
        }
        return list;
    }

     public void supprimer(String e) {
            
        try {
            String sql = "delete from  film  where nom=?"; //sql à compléter
            System.out.println(sql);
            PreparedStatement preparedStatement = null; //retour = données de la base type ID, FIRSTNAME, LASTNAME
            preparedStatement = connection.prepareStatement(sql);
             preparedStatement.setString(1, e);//la connection prépare le preparedStatement
            // on remplace le premier ? par employee.getId()
            preparedStatement.executeUpdate(); //le preparedStatement exécute le sql paramètré (executeUpdate() ne suppose pas de retour)
            //retour = données de la base type ID, FIRSTNAME, LASTNAME
        } catch (SQLException ex) {
            Logger.getLogger(FilmDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
                
          

         }

public Film remplissage (String e){
     Film f = null;
    ResultSet rs = null;
    String sql   = "select * from film where nom=?";
    PreparedStatement ps = null;
        try {
            ps = connection.prepareStatement(sql);
            ps.setString(1, e);
            rs = ps.executeQuery();
            if (rs.next()){
           f = new Film(rs.getString("nom"),rs.getString("genre"),rs.getString("datedesortie"),rs.getInt("vote"),rs.getString("synopsis"));
            }
        } catch (SQLException ex) {
            Logger.getLogger(FilmDAO.class.getName()).log(Level.SEVERE, null, ex);
        }


return f ;
}
 public void  modifier (Film f ,FileInputStream stream, File file  ){
        try {
            String sql = "update film set nom=?,genre=?,datedesortie=?,synopsis=?,affiche=? where nom=?";
            ResultSet rs = null;
            PreparedStatement ps = null;
            ps = connection.prepareStatement(sql);
            ps.setString(1, f.getNom());
            ps.setString(2, f.getGenre());
            ps.setString(3, f.getDatedesortie());
            ps.setString(4, f.getSynopsis());
            ps.setBinaryStream(5, stream, (int)file.length());
            ps.setString(6, f.getNom2());
            ps.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(FilmDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

 }

 public void ajouter (Film f , FileInputStream stream, File file){
 String sql="insert  into film (nom,genre,datedesortie,synopsis,affiche,vote) values (?,?,?,?,?,?)";
 ResultSet rs = null;
 PreparedStatement ps = null;
        try {
            ps = connection.prepareStatement(sql);
            ps.setString(1,f.getNom());
            ps.setString(2, f.getGenre());
            ps.setString(3,f.getDatedesortie());
            ps.setString(4,f.getSynopsis());
            ps.setBinaryStream(5, stream, (int)file.length());
            ps.setInt(6, 0);
            ps.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(FilmDAO.class.getName()).log(Level.SEVERE, null, ex);
        }



 }

 public void chargeIMG(String name ,String  nomaffiche) throws Exception
{
  File monImage = new File("C:\\images\\"+nomaffiche+".jpg");
  FileOutputStream ostreamImage = new FileOutputStream(monImage);

  try
  {
    PreparedStatement ps = connection.prepareStatement("select affiche from film where nom=?");

    try
    {
      ps.setString(1,name);
      ResultSet rs = ps.executeQuery();

      try
      {
        if(rs.next())
        {
      	  InputStream istreamImage = rs.getBinaryStream("affiche");

      	  byte[] buffer = new byte[1024];
      	  int length = 0;

      	  while((length = istreamImage.read(buffer)) != -1)
      	  {
      	    ostreamImage.write(buffer, 0, length);
	  }
  	}
      }
      finally
      {
        rs.close();
      }
    }
    finally
    {
      ps.close();
    }
  }
  finally
  {
    ostreamImage.close();
  }
}

 public void affichage(JTable table){

    String sql = "select nom,genre,datedesortie,vote,synopsis from film";
    PreparedStatement ps = null;
    ResultSet rs = null;


    try {

            ps = connection.prepareStatement(sql);
            rs = ps.executeQuery();

            table.setModel(DbUtils.resultSetToTableModel(rs));


        } catch (SQLException ex) {
            Logger.getLogger(Administrateurform.class.getName()).log(Level.SEVERE, null, ex);
        }

}

 public void RechercheNom(Film f , JTable table){

 PreparedStatement ps = null;
 ResultSet rs = null;
 String sql  = "select  nom,genre,datedesortie,vote,synopsis from  film where nom like ? ";
        try {
            ps = connection.prepareStatement(sql);
            ps.setString(1,"%"+f.getNom()+"%");
            rs =ps.executeQuery();
             table.setModel(DbUtils.resultSetToTableModel(rs));

        } catch (SQLException ex) {
            Logger.getLogger(FilmDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

 }
  public void RechercheGenre(String genre, JTable table){

 PreparedStatement ps = null;
 ResultSet rs = null;
 String sql  = "select  nom,genre,datedesortie,vote,synopsis from  film where (genre = ?) ";
        try {
            ps = connection.prepareStatement(sql);
            ps.setString(1,genre);
            rs =ps.executeQuery();
             table.setModel(DbUtils.resultSetToTableModel(rs));

        } catch (SQLException ex) {
            Logger.getLogger(FilmDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

 }

    public void TriDate(JTable table){

 PreparedStatement ps = null;
 ResultSet rs = null;
 String sql  = "select  nom,genre,datedesortie,vote,synopsis from  film  order by datedesortie ";
        try {
            ps = connection.prepareStatement(sql);
            rs =ps.executeQuery();
             table.setModel(DbUtils.resultSetToTableModel(rs));

        } catch (SQLException ex) {
            Logger.getLogger(FilmDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

 }

     public void Classement(JTable table){

 PreparedStatement ps = null;
 ResultSet rs = null;
 String sql  = "select  nom,genre,datedesortie,vote,synopsis from  film  order by vote desc ";
        try {
            ps = connection.prepareStatement(sql);
            rs =ps.executeQuery();
             table.setModel(DbUtils.resultSetToTableModel(rs));

        } catch (SQLException ex) {
            Logger.getLogger(FilmDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

 }

     public void  vote(Film f,JTable table,Utilisateur u){

     PreparedStatement ps = null;
     ResultSet rs = null;
     String sql ="update film  set vote=vote+1 where nom=?";
     String sql2 = "select titre,login from votes where (titre=? and login=?)";
       String  sql3 = "insert into votes (titre,login) values (?,?)";
        try {
            ps = connection.prepareStatement(sql2);
            ps.setString(1, f.getNom());
            ps.setString(2,u.getLogin() );
            rs = ps.executeQuery();
            if(rs.next()){
            JOptionPane.showMessageDialog(null,"Vous avez déja votez pour ce film");
            }
 else{
           ps = connection.prepareStatement(sql3);
           ps.setString(1, f.getNom());
           ps.setString(2, u.getLogin());
           ps.executeUpdate();


                try {
            ps = connection.prepareStatement(sql);
            ps.setString(1, f.getNom());
            ps.executeUpdate();
            affichage(table);


        } catch (SQLException ex) {
            Logger.getLogger(FilmDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        }
        } catch (SQLException ex) {
            Logger.getLogger(FilmDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
     
       


     }


     public boolean  rech(String nom){
       boolean test = false ;
        Film found = null ;
       String sql = "SELECT nom FROM FILM where  nom=?";

            PreparedStatement preparedStatement = null;
            ResultSet resultSet = null;
        try {

            preparedStatement = connection.prepareStatement(sql);
             preparedStatement.setString(1, nom);
            resultSet = preparedStatement.executeQuery();
            System.out.println(sql);
             if (resultSet.next()) {
            found = new Film(resultSet.getString("nom"));
            String l = found.getNom();
            if  (l.equals(nom)){
            test = true;}
            }

 else {test = false;}

        } catch (SQLException ex) {
            Logger.getLogger(AdministrateurDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

       return test ;

       }

    
}




